package com.zj.sa_token.config;

import cn.dev33.satoken.config.SaTokenConfig;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.http.HttpMethod;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {


    // Swagger WHITELIST
    public static final String[] SWAGGER_WHITELIST = {
            "/swagger-ui.html",
            "/swagger-ui/*",
            "/swagger-resources/**",
            "/v2/api-docs",
            "/v3/api-docs",
            "/webjars/**",
            "/doc.html",
            "/actuator/**"
    };
    public static final String[] AUTH_ADMIN = {
            "/user/doLogin",
            "/user/getCode",
    };
//    注册拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry){
//        注册Sa-Token拦截器，校验规则为 StpUtil.login(); 登录校验
        registry.addInterceptor(new SaInterceptor(handler -> {

            SaRouter.match("/**")
                    .notMatch(SWAGGER_WHITELIST)
                    .notMatch(AUTH_ADMIN)
                    .check(r -> StpUtil.checkLogin());

            // 角色校验 -- 拦截以 admin 开头的路由，必须具备 admin 角色或者 super-admin 角色才可以通过认证
//            SaRouter.match("/admin/**", r -> StpUtil.checkRoleOr("admin", "super-admin"));

            // 权限校验 -- 不同模块校验不同权限
//            SaRouter.match("/user/**", r -> StpUtil.checkPermission("user"));
//            SaRouter.match("/admin/**", r -> StpUtil.checkPermission("admin"));
//            SaRouter.match("/goods/**", r -> StpUtil.checkPermission("goods"));
//            SaRouter.match("/orders/**", r -> StpUtil.checkPermission("orders"));
//            SaRouter.match("/notice/**", r -> StpUtil.checkPermission("notice"));
//            SaRouter.match("/comment/**", r -> StpUtil.checkPermission("comment"));


        })).addPathPatterns("/**");
    }

    /**
     * 配置参数
     *
     * @return
     */
    @Bean
    @Primary
    public SaTokenConfig getSaTokenConfigPrimary() {
        SaTokenConfig config = new SaTokenConfig();
        // token名称 (同时也是cookie名称)
        config.setTokenName("satoken");
        // token风格
//        config.setTokenStyle("tik");
        // token前缀
        config.setTokenPrefix("");
        // token有效期，单位s 默认30天，不支持自动续签
        config.setTimeout(30 * 24 * 60 * 60);
        // 自动续签，指定时间内有操作，则会自动续签
        config.setAutoRenew(true);
        // 是否尝试从header里读取token
        config.setIsReadHeader(true);
        // 是否尝试从cookie里读取token
        config.setIsReadCookie(false);
        // 是否尝试从请求体里读取token
        config.setIsReadBody(false);
        // 是否在初始化配置时打印版本字符画
        config.setIsPrint(true);
        // 是否输出操作日志
        config.setIsLog(true);
        return config;
    }
}
